package org.swimv2.controller;

import java.util.ArrayList;
import java.util.Collection;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import org.jboss.ejb3.annotation.RemoteBinding;
import org.swimv2.model.Persona;
import org.swimv2.model.Richiestaamicizia;
import org.swimv2.model.Richiestanuovaabilita;
import org.swimv2.model.Richiestapartecipazionelavoro;
import org.swimv2.util.Notifica;
import org.swimv2.util.Stato;
import org.swimv2.util.Tipo;

/**
 * Session Bean implementation class GestioneNotifiche
 */
@Stateless
@RemoteBinding(jndiBinding="GestioneNotificheRemote")
public class GestioneNotifiche implements GestioneNotificheRemote {
	@PersistenceContext(unitName="swimv2db")
	private EntityManager manager;
	
	public static final String JNDI_NAME="GestioneNotificheRemote";

    /**
     * Default constructor. 
     */
    public GestioneNotifiche() {
        // TODO Auto-generated constructor stub
    }

	@Override
	public Collection<Notifica> getNotifiche(String userId) {
		Collection<Notifica> notifiche = new ArrayList<Notifica>();
		Query qPersona = manager.createNamedQuery("Persona.findByUsername");
		qPersona.setParameter("username", userId);
		Persona persona =(Persona) qPersona.getSingleResult();
		if(persona.getRuolo().equals("UTENTE"))
		{
			Query q = manager.createNamedQuery("Richiestaamicizia.findByRicevente");
			q.setParameter("userId", userId);
			q.setParameter("stato", "PENDENTE");
			try{
			Collection<Richiestaamicizia> rAmicizia = (ArrayList<Richiestaamicizia>)q.getResultList();
			for(Richiestaamicizia temp: rAmicizia)
				{
				notifiche.add(new Notifica(Stato.PENDENTE, Tipo.AMICIZIA, temp.getPersona2().getUserID(), temp.getPersona1().getUserID()));
				}
			}catch(NoResultException e){
			Collection<Richiestaamicizia> rAmicizia=new ArrayList<Richiestaamicizia>();
			}
			q = manager.createNamedQuery("Richiestaamicizia.findByRichiedente");
			q.setParameter("userId", userId);
			q.setParameter("stato", "ACCETTATA");
			try{
				Collection<Richiestaamicizia> rAmiciziaAcc = (ArrayList<Richiestaamicizia>)q.getResultList();
				for(Richiestaamicizia temp: rAmiciziaAcc)
					{
					Notifica notifica = new Notifica(Stato.ACCETTATA, Tipo.AMICIZIA, temp.getPersona2().getUserID(), temp.getPersona1().getUserID());
					notifiche.add(notifica);
					}
				}catch(NoResultException e){
				Collection<Richiestaamicizia> rAmiciziaAcc=new ArrayList<Richiestaamicizia>();
				}
			q = manager.createNamedQuery("Richiestapartecipazionelavoro.findByRicevente");
			q.setParameter("userId", userId);
			//q.setParameter("stato", "PENDENTE");
			Collection<Richiestapartecipazionelavoro> rLavoro = (ArrayList<Richiestapartecipazionelavoro>)q.getResultList();
			for(Richiestapartecipazionelavoro temp: rLavoro)
				{
				if(temp.getStato().equals("ACCETTATA"))
				{
					notifiche.add(new Notifica(Stato.ACCETTATA, Tipo.LAVORO, temp.getLavoro().getId(), temp.getLavoro().getNome(), temp.getPersona().getUserID()));
				}
				if(temp.getStato().equals("PENDENTE"))
				{
					notifiche.add(new Notifica(Stato.PENDENTE, Tipo.LAVORO, temp.getLavoro().getId(), temp.getLavoro().getNome(), temp.getPersona().getUserID()));
				}
				if(temp.getStato().equals("RIFIUTATA"))
				{
					notifiche.add(new Notifica(Stato.RIFIUTATA, Tipo.LAVORO, temp.getLavoro().getId(), temp.getLavoro().getNome(), temp.getPersona().getUserID()));
				}
				}
		
		}
		else if(persona.getRuolo().equals("AMMINISTRATORE"))
		{
			Query q = manager.createNamedQuery("Richiestanuovaabilita.findPendente");
			Collection<Richiestanuovaabilita> rAbilita = (ArrayList<Richiestanuovaabilita>)q.getResultList();
			for(Richiestanuovaabilita temp: rAbilita)
			{
				notifiche.add(new Notifica(Stato.PENDENTE, Tipo.ABILITA, temp.getNome(),""));
			}
			
		}
		return notifiche;
	}

}
